package com.tt.fashionWebSite.util;

import java.util.List;

/**
 * Created by isoft-work 5 on 12/28/2014.
 */
public class Deductive {
   /**
    * L là list vế trái của luật
    * R là list vế phải của luật
    * GT là giả thuyết suy luận
    */
   private List<List<String>> L;
   private List<List<String>> R;
   private List<String> GT;

   public Deductive(List<List<String>> l, List<List<String>> r, List<String> gt) {
      this.GT = gt;
      this.L = l;
      this.R = r;

      runDeductive(this.L, this.R, this.GT);
   }

   // kiểm tra vế trái có là tập con của GT
   private Boolean checkLeft(List<String> li, List<String> gt) {
      Boolean result = false;
      Integer count = 0;
      for(Integer i = 0; i < li.size(); i++) {
         for(Integer j = 0; j < gt.size(); j++) {
            if(li.get(i).equals(gt.get(j))) {
               count += 1;
               break;
            }
            else {
               if(j == gt.size() - 1) {
                  return result;
               }
            }
         }
      }
      if(count == li.size()) {
         result = true;
      }
      return result;
   }

   private void runDeductive(List<List<String>> left, List<List<String>> right, List<String> gt) {
      for(Integer i = 0; i < left.size(); i++) {
         if(checkLeft(left.get(i), gt)){
            // thêm vào giả thuyết
            List<String> temR = right.get(i);
            List<String> temL = left.get(i);
            for(Integer j = 0; j < temR.size(); j++) {
               this.GT.add(temR.get(j));
            }
            // bỏ luật vừa kiểm
            this.R.remove(this.R.indexOf(temR));
            this.L.remove(this.L.indexOf(temL));
            runDeductive(this.L, this.R, this.GT);
         }
      }
   }

   public List<String> getGT() {
      return GT;
   }

   public void setGT(List<String> GT) {
      this.GT = GT;
   }
}
